package com.dl.mall.mapper;

import com.dl.mall.entity.Product;
import com.dl.mall.entity.ProductSpecs;
import com.dl.mall.entity.user.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 产品类
 * @author DL
 * @create 2022-03-23 15:27
 */
@Mapper
public interface ProductMapper {

    /**
     * 根据 规格id 查询产品 SKU
     * @param specsId 规格id
     * @return SKU
     */
    ProductSpecs queryProductSpecsBySpecsId(String specsId);

    /**
     * 根据 产品id 查询产品 SPU
     * @param productId 产品id
     * @return SPU
     */
    Product queryProductById(String productId);

    /**
     * 根据 产品id 查询产品 SKU列表
     * @param productId 产品id
     * @return SKU
     */
    List<ProductSpecs> queryProductSpecsById(String productId);

    /**
     * 根据 产品id + 配置 搜索sku
     * @param productId 产品id
     * @param productSpecs 产品规格
     * @return 产品
     */
    ProductSpecs queryProductBySpecs(@Param("productId") String productId, @Param("productSpecs") String productSpecs);

    /**
     * 根据 品牌id 查询产品
     * @param brandId 品牌id
     * @return 产品集合
     */
    List<Product> queryProductByBrandId(@Param("brandId") int brandId);

    /**
     * 查询所有产品
     * @return 产品集合
     */
    List<Product> queryProduct();

    /**
     * 根据 关键字 查询产品
     * @return 产品集合
     */
    List<Product> queryProductByKeyWord(String keyWord);


    /**
     * 随机查询手机
     * @param maximum 最大查询
     * @return 手机信息
     */
    List<Product> queryPhone(Integer maximum);

    /**
     * 随机查询电脑
     * @param maximum 最大查询
     * @return 电脑信息
     */
    List<Product> queryComputer(Integer maximum);

    /**
     * 随机查询智能设备
     * @param maximum 最大查询
     * @return 手机信息
     */
    List<Product> queryIntelligent(Integer maximum);

    /**
     * 随机查询配件
     * @param maximum 最大查询
     * @return 电脑信息
     */
    List<Product> queryAccessory(Integer maximum);

    /**
     * 秒杀扣除库存
     * @param specsId 规格id
     * @param total 总数
     * @return 结果
     */
    int deductSpecsStockSeckill(@Param("specsId") String specsId, @Param("total") Integer total);

/*    *//**
     * 订单取消，根据 订单 恢复库存
     * @param specsId 规格id
     * @param total 总数
     * @return 结果
     *//*
    int recoverySpecsStock(@Param("specsId") String specsId, @Param("total") Integer total);*/

    /**
     * 用户购物，根据 订单 扣除库存
     * @param orderInfoList 订单商品信息
     * @return 结果
     */
    int deductSpecsStock(@Param("orderInfoList") List<OrderInfo> orderInfoList);

    /**
     * 订单取消，根据 订单 恢复库存
     * @param orderInfoList 订单商品信息
     * @return 结果
     */
    int recoverySpecsStock(@Param("orderInfoList") List<OrderInfo> orderInfoList);

    /**
     * 更新所有商品库存
     * @param productSpecsMap redis商品库存信息
     * @return 结果
     */
    int updateAllSpecsStock(@Param("productSpecsMap") Map<Object,Object> productSpecsMap);

    /* ================================ admin =============================== */

    /**
     * 增加产品spu
     * @param map spu信息
     * @return 影响条数
     */
    int insertProductSpu(Map<String,Object> map);

    /**
     * 增加产品spu
     * @param skuList sku列表
     * @return 影响条数
     */
    int insertProductSku(@Param("skuList") List<Map<String, Object>> skuList);

    /**
     * 根据 产品id 更新状态
     * @param productId 规格id
     * @param state 状态
     * @return 结果
     */
    int updateProductState(@Param("productId") String productId, @Param("state") Integer state);

    /**
     * 根据 规格id 更新库存
     * @param specsId 规格id
     * @param specsStock 新库存
     * @return 结果
     */
    int updateSpecsStock(@Param("specsId") String specsId, @Param("specsStock") Integer specsStock);

    /**
     * 根据 规格id 更新状态
     * @param specsId 规格id
     * @param state 状态
     * @return 结果
     */
    int updateSpecsState(@Param("specsId") String specsId, @Param("state") Integer state);

    /**
     * 根据 条件 查询产品列表
     * @param map 条件
     * @return 产品分页
     */
    List<Product> queryProductListCondition(Map<String,Object> map);

    /**
     * 获得所有产品的规格
     * @return 产品分页
     */
    List<ProductSpecs> queryProductSpecsList();


}
